package com.hd.appcommon.enums;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: hzp
 * @date: 2021/12/2
 * @description:
 */
public enum UpEvent {

    /**
     * 确认包
     */
    ack,

    /**
     * 注册
     */
    register,

    /**
     * 设备信息上报
     */
    deviceInfo,

    /**
     * 密钥录入信息上报
     */
    keyInfo,

    /**
     * 开锁记录上报
     */
    unlock,

    /**
     * 报警上报
     */
    alarm,

    /**
     * 恢复出厂设置
     */
    reset,

    /**
     * 新访客事件上报
     */
    visitor,

    /**
     * 绑定
     */
    bind,

    /**
     * 电量上报
     */
    electricity,

    /**
     * 时钟较时
     */
    timing,

    /**
     * 心跳
     */
    heartbeat,

    // 以下为2019.08.30接入NBIoT锁时新增

    /**
     * 模组信息上报,仅NBIoT锁
     */
    moduleInfo,

    /**
     * 临时秘钥状态更新上报
     */
    tmpkeyStatus,

    /**
     * 远程下发卡密钥(IC卡/身份证uid)应答包， 目前仅NBIoT锁支持
     */
    remoteCardAck,

    /**
     * 下发长效秘钥应答包， 目前仅NBIoT锁支持
     */
    permanentKeyAck,

    /**
     * 复杂盐值同步， 目前仅NBIoT锁支持
     */
    saltInfoSyn;



    private final static Map<String, UpEvent> ENUM_MAP = new HashMap<String,UpEvent>();

    /**
     * 不需要及时处理的消息类型
     */
    public final static List<String> SLOW_EVENT = new ArrayList<>();

    /**
     * 需要及时处理的消息类型，不能长时间阻塞
     */
    public final static List<String> BUSY_EVENT = new ArrayList<>();

    static {
        for (UpEvent upEvent : values()) {
            ENUM_MAP.put(upEvent.toString(), upEvent);
        }
        SLOW_EVENT.add(register.toString());
        SLOW_EVENT.add(deviceInfo.toString());
        SLOW_EVENT.add(alarm.toString());
        SLOW_EVENT.add(reset.toString());
        SLOW_EVENT.add(visitor.toString());
        SLOW_EVENT.add(electricity.toString());
        SLOW_EVENT.add(timing.toString());
        SLOW_EVENT.add(heartbeat.toString());
        SLOW_EVENT.add(moduleInfo.toString());
        SLOW_EVENT.add(tmpkeyStatus.toString());
        SLOW_EVENT.add(saltInfoSyn.toString());
        SLOW_EVENT.add(unlock.toString());

        BUSY_EVENT.add(ack.toString());
        BUSY_EVENT.add(keyInfo.toString());
        BUSY_EVENT.add(bind.toString());
        BUSY_EVENT.add(remoteCardAck.toString());
        BUSY_EVENT.add(permanentKeyAck.toString());
    }

    /**
     * 字符串转枚举类型
     * @param cmd 命令
     * @return 获取到具体的事件类型
     */
    public static UpEvent getEnum(String cmd) {
        return ENUM_MAP.get(cmd);
    }
}

